/**
 * \file kernel/pcb.h
 * \brief Biblioteca de funciones y constantes para acceso a los PCB 
 */
#ifndef _PCB_H_
#define _PCB_H_

#include <kernel/shm.h>
#include <kernel/tiempo.h>

#define PROC_NO_DEFINIDO	-1	/*!< Valor de proceso no definido */
#define	PROC_EJECUTANDO		0 /*!< Valor de proceso ejecutando */
#define PROC_LISTO		1 /*!< Valor de proceso listo */
#define PROC_ESPERANDO		2 /*!< Valor de proceso Esperando */
#define PROC_DETENIDO		3 /*!< Valor de proceso Detenido */
#define PROC_ELIMINADO		4 /*!< Valor de proceso eliminado */
#define PROC_ZOMBIE		5 /*!< Valor de proceso Zombie */
#define PROC_WOTRACER		-1 /*!< Valor de proceso traceable */

#define TAM_ELF		0x80     /*! Define el tamaño de la cabecera ELF */

#define NADA   0
#define EXEC   1
#define FORK   2


typedef struct {
	unsigned  char	ident[16];
	unsigned  short	type;
	unsigned  short	machine;
	unsigned  int	version;
	unsigned  int	entry;
	unsigned  int	phoff;
	unsigned  int	sphoff;
	unsigned  int	flags;
	unsigned  short	ehsize;
	unsigned  short	phentsize;
	unsigned  short	phnum;
	unsigned  short	shentsize;
	unsigned  short	shnum;
	unsigned  short	shstrndx;
} elfHeader;

typedef struct {
	unsigned int name;
	unsigned int type;
	unsigned int flags;
	unsigned int addr;
	unsigned int offset;
	unsigned int size;
	unsigned int link;
	unsigned int info;
	unsigned int addralign;
	unsigned int entsize;
}SHeader;

typedef struct {
        unsigned int type;	//Elf32_Word p_type;
	unsigned int offset;	//Elf32_Off  p_offset;
	unsigned int vaddr;	//Elf32_Addr p_vaddr;
        unsigned int paddr;	//Elf32_Addr p_paddr;
        unsigned int filesz;	//Elf32_Word p_filesz;
        unsigned int memsz;	//Elf32_Word p_memsz;
        unsigned int flags;	//Elf32_Word p_flags;
        unsigned int align;	//Elf32_Word p_align;
} PHeader;


/**
 \brief Estructura que recibe la cabecera ELF de un proceso

*/
typedef struct {
   elfHeader elfHeaderData;
   SHeader   SHeaderData;
   PHeader   PHeaderData;
   unsigned char ucbuffer[4];
} stuHeaderELF;

/**
 \brief Estructura que indica si un proceso espera para obtener memoria

*/
typedef struct {
   int iEstado;
   long int liTamanio;
} stuEsperarMemoria;




/**
 * \brief Estructura de la PCB 
 */

typedef struct _stuPCB_{
  unsigned long int ulId;         /*!< id del proceso */
  unsigned int uiIndiceGDT_CS;         /*!< indice del descriptor de segmento de codigo de este proc en la GDT */
  unsigned int uiIndiceGDT_DS;         /*!< indice del descriptor de segmento de datos de este proc en la GDT */
  unsigned int uiIndiceGDT_TSS;         /*!< indice de la TSS de este proc en la GDT */
  unsigned int uiIndiceGDT_SS0;      /*!< indice del descriptor del segmento de stack ss0 de este proc en la GDT */
  void (* vFnFuncion) ();         /*!< puntero a funcion (proceso) */

  unsigned long ulParentId;   /*!< id del padre */
  unsigned long ulUsuarioId;  /*!< id del usuario */
  int iPrioridad;                 /*!< para futuro uso */
  int iEstado;                    /*!< ver estados mas arriba (PROC_XXX) */
  unsigned long lNHijos;
  int iExitStatus;
  unsigned long ulLugarTSS;
  char stNombre[25];
  unsigned int uiTamProc;
  struct stuTablaPagina * pstuTablaPaginacion;
  unsigned int uiDirBase,
           
	       uiLimite;
  stuMemoriasAtachadas memoriasAtachadas[MAXSHMEMPORPROCESO];

  //agregado
  unsigned long ulTiempoEspera;		/*!< Tiempos para algoritmos tipo HRN */
  unsigned long ulTiempoServicio;	/*!< Tiempo de servicio del proceso */
  //fin agregado	

  /*!< Estructura usada para guardar los tiempos de proceso usados para la syscall "times"*/	
  struct stuPCB* pstuPcbSiguiente;
  /*!< Array con los contadores utilizados como temporizadores para la SC "times"*/
  tms stuTmsTiemposProceso;
   /*!< Tiempo durante el cual el proceso tiene que permanecer "dormido" */
  itimerval timers[3];
  /*!< Puntero a donde se guardar� el resto del tiempo que deb�a estar detenido el proceso y no lo hizo*/
  long lNanosleep;
   /*!< Indica si el proceso esta siendo rastreado.*/  
  unsigned int *puRestoDelNanosleep;
   /*!< Indica si el proceso esta siendo rastreado.*/  
    long lPidTracer;            /*!< Indica si el proc esta siendo rastreado.*/  
    //Agregado 2008 - GRUPO SEGMENTACION PURA
    unsigned int uiTamanioTexto;/*!< Bytes de codigo ejecutable */
    unsigned int uiTamanioDatosInicializados;/*!< Bytes de datos globales inicializados (incluye BSS al final)*/
    unsigned int uiTamanioStack;/*!< Bytes de stack (libres+usados) */

    unsigned int uiTamanioOverhead;     /*!< Bytes de Overhead (frag. interna)*/

    unsigned int uiEsperaTeclado; // 2009 -  Sergio Martin - Indica que el proceso está esperando una entrada de teclado.

    stuHeaderELF stuCabeceraELF;
    int iModoParticion; // 2009 - Sergio Martin -  Indica que modo tiene. Si es particion Fija no dejamos que haga brk.
    stuEsperarMemoria  stuEsperaMemoria;
    unsigned int uiBaseSs0; // Kultenko 2009
}stuPCB;


#endif 
